#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include "utils.hpp"
using namespace std;

FILE* _file;
int midaKB;
char* buf;

void zeros();
void uniDos();
void alfabet();
void ajuda();

int main(int argc, char *argv[])
{
	if(argc==4){
		//Preparem l'arxiu i obtenim la mida
		_file = fopen(argv[1], "rb");
		midaKB = atoi(argv[2]);
		//Calculem les pagines que te.
		fseek (_file, 0, SEEK_END);
		long int mida = ftell(_file) / 1024;
		fseek (_file, 0, SEEK_SET);
		//Comprobem que no demanem una pagina fora de rang
		if (atoi(argv[2])>=0 and mida>=atoi(argv[2]))
		{
			buf = new char[1024];
			fseek (_file, 1024*atoi(argv[2]), SEEK_SET);
			fread(buf, 1, 1024, _file);
			//Mostrem mapa de dades, segons el format escullit.
			if(strcmp(argv[3],"-hex")==0) utils::mapArray (buf, 1024, HEX);
			else if (strcmp(argv[3],"-bin")==0) utils::mapArray (buf, 1024, BIN);
			else if (strcmp(argv[3],"-ascii")==0) utils::mapArray (buf, 1024, ASCII);
			else ajuda();
		}
		else cout << "Valor de pagina no valid" << endl;
	}
	else ajuda();
	//Tanquem l'arxiu
	fclose (_file);
}


//Formateja inserint caracters nuls.
void zeros()
{
    char buf[1024];
    for (int i = 0; i < 1024; i++) buf[i] = NULL;
    for (int i = 0; i < midaKB; i++) fwrite(buf, 1024, 1, _file);
    cout << "zeros..." << endl;
}


//Formateja inserint uns i dossos alternativament.
void uniDos()
{
    char buf0[1024];
    for (int i = 0; i < 1024; i++) buf0[i] = 0;
    char buf1[1024];
    for (int i = 0; i < 1024; i++) buf1[i] = 1;

    bool par;

    for (int i = 0; i < midaKB; i++)
    {
        par = ((i%2) == 0) ? true : false;
        if(par)
            fwrite(buf0, 1024, 1, _file);
        else
            fwrite(buf1, 1024, 1, _file);
    }
    cout << "unidos..." << endl;
}


//Formateja inserint una lletra diferent per cada pagina.
void alfabet()
{
    char buf[1024];
    char car = 'a';
    int offset = 0;
    for (int i = 0; i < midaKB; i++)
    {
    	//Generem el buffer amb el caracter que pertoca.
    	for (int i = 0; i < 1024; i++) buf[i] = car+offset;
    	//Si arribem a la 'z', tornem a la 'a'
    	if (offset < 25) offset++; else offset = 0;
    	//Copiem el buffer al disc.
    	fwrite(buf, 1024, 1, _file);
    }
    cout << "alfabet..." << endl;
}


//Mostra informacio sobre els parametres d'execucio
void ajuda()
{
	cout << endl;
	cout << "FBDA Crear Disk - Parametres:" << endl;
	cout << "MapDisk [nom_fitxer] [num_pagina] -hex" << endl;
	cout << "MapDisk [nom_fitxer] [num_pagina] -bin" << endl;
	cout << "MapDisk [nom_fitxer] [num_pagina] -ascii" << endl;
}


